﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using Dlls;
using Persistencia;
using UI.Views.Consultas;

namespace UI.Views.Cadastros
{
    /// <summary>
    /// Interaction logic for frmCadastrarProduto.xaml
    /// </summary>
    public partial class frmCadastrarProduto : Window
    {
        private Produto produto;
        private Context context;
        private ProdutosDLL entidade;
        private GrupoProdutoDLL grupos;
        private EstoqueDLL estoqueDLL;
        private Estoque estoque;

        private int codGrupo;
        public int codigoParaAlterarOuDeletar;

        public frmCadastrarProduto(int codigo)
        {
            InitializeComponent();
            context = new Context();
            entidade = new ProdutosDLL();
            grupos = new GrupoProdutoDLL();
            estoque = new Estoque();
            estoqueDLL = new EstoqueDLL();
 
            if (codigo != 0)
            {
                codigoParaAlterarOuDeletar = codigo;
                produto = entidade.getProduto(codigoParaAlterarOuDeletar);
            }
            else
            {
                produto = new Produto();
            }

            cbxGrupoProduto.ItemsSource = grupos.List().Select(o => o.Nome);
            
        }

        public void InsertOrUpdate(object sender, RoutedEventArgs e)
        {
            try
            {
            if (codigoParaAlterarOuDeletar != 0)
            {
                produto.InsumoProducao = ehInsumo.IsChecked;
                string grupo = cbxGrupoProduto.Text;
                produto.CodGrupo = int.Parse(grupos.getCodigoPorNomeGrupo(grupo).Codigo.ToString());
                produto.Nome = txtNome.Text.ToString();
                produto.DescricaoProduto = txtDescricaoProduto.Text.ToString();
                produto.EstoqueMinimo = decimal.Parse(txtEstoqueMinimo.Text.ToString());
                produto.EstoqueMaximo = decimal.Parse(txtEstoqueMaximo.Text.ToString());
                produto.UnidadeMedida = txtUnidadeMedida.Text;
                estoque.ValorVenda = decimal.Parse(txtValorVenda.Text.ToString());         

                entidade.Update(codigoParaAlterarOuDeletar, produto);
                estoqueDLL.Update(codigoParaAlterarOuDeletar, estoque);

                MessageBox.Show("Produto alterado com sucesso.");
                Reset(0,this);
            }
            else 
            {
                produto.InsumoProducao = ehInsumo.IsChecked;
                string grupo = cbxGrupoProduto.Text;
                produto.CodGrupo = int.Parse(grupos.getCodigoPorNomeGrupo(grupo).Codigo.ToString());
                produto.Nome= txtNome.Text.ToString();
                produto.DescricaoProduto = txtDescricaoProduto.Text.ToString();
                produto.EstoqueMinimo = decimal.Parse(txtEstoqueMinimo.Text.ToString());
                produto.EstoqueMaximo = decimal.Parse(txtEstoqueMaximo.Text.ToString());
                produto.UnidadeMedida = txtUnidadeMedida.Text;

                entidade.Insert(produto);
                estoque = new Estoque()
                {
                    CodProduto = produto.Codigo,
                    ValorVenda = decimal.Parse(txtValorVenda.Text.ToString()),
                };

                estoqueDLL.Insert(estoque);
                MessageBox.Show("Produto adicionado com sucesso.");
                Reset(0, this);
            }
            produto = new Produto();
            }
            catch (Exception)
            {

                MessageBox.Show("Erro na alteração/inclusão do registro, favor verificar o preenchimento correto dos campos");
            }
           
        }

        public void Edit(object sender, KeyEventArgs e)
        { 
            if (e.Key == Key.Enter)
            {
                if (txtCodigo.Text != "")
                {
                    codigoParaAlterarOuDeletar = int.Parse(txtCodigo.Text.ToString());
                    Produto produto = entidade.getProduto(codigoParaAlterarOuDeletar);
                    if (produto != null)
                    {
                        txtCodigo.Text = produto.Codigo.ToString();
                        ehInsumo.IsChecked = produto.InsumoProducao;
                        txtUnidadeMedida.Text = produto.UnidadeMedida.ToString();
                        cbxGrupoProduto.Text = grupos.getGrupoProduto(int.Parse(produto.CodGrupo.ToString())).Nome.ToString();
                        txtNome.Text = produto.Nome.ToString();
                        txtDescricaoProduto.Text = produto.DescricaoProduto.ToString();
                        txtEstoqueMinimo.Text = produto.EstoqueMinimo.ToString();
                        txtEstoqueMaximo.Text = produto.EstoqueMaximo.ToString();
                        Estoque estoque = estoqueDLL.GetEstoque(codigoParaAlterarOuDeletar);
                        if (estoque!=null)
                        {
                            txtQntdeEstoque.Text = estoque.QuantidadeEstoque.ToString();
                            txtValorVenda.Text = estoque.ValorVenda.ToString();
                        }
                        //  txtValorVenda.Text = pro
                        // cbxGrupoProduto.Text = 
                    }
                    else
                    {
                        MessageBox.Show("Produto não encontrado");
                    }
                }
                // GrupoProduto grupoProduto = grupos.getGrupoProduto( 

                else
                {
                    frmConsultaPadrao consultaPadrao = new frmConsultaPadrao("Produtos");
                    consultaPadrao.Owner = this;
                    consultaPadrao.Show();
                }
                
            }
        }

        public void Delete(object sender, RoutedEventArgs e)
        {
            try
            {
            if (txtCodigo.Text != "")
            {
                entidade.Delete(int.Parse(txtCodigo.Text));
                MessageBox.Show("Produto excluido com sucesso.");
                Reset(0, this);
            }
            else
            {
                MessageBox.Show("Selecione um produto para excluir");
            }
            }
            catch (Exception)
            {

                MessageBox.Show("Não foi possivel excluir o produto selecionado, ele pode pertencer há algum orçamento ou venda");
            }
        }

        public void Novo(object sender, RoutedEventArgs e)
        {

            Reset(0,this);
        }

 
        private static void Reset(int depth, DependencyObject obj)
        {
            // Percorre todos os filhos do objeto visual.
            for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
                Reset(depth + 1, VisualTreeHelper.GetChild(obj, i));

            // Se for um TextBox, limpa.
            if (obj is TextBox)
                ((TextBox)obj).Text = string.Empty;
            if (obj is ComboBox)
                ((ComboBox)obj).Text = string.Empty;
            if (obj is CheckBox)
                ((CheckBox)obj).IsChecked = false;
        
        }

        private void txtNome_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Enter || e.Key== Key.Tab)
            {
                txtDescricaoProduto.Text = txtNome.Text;
            }
        }

    
    }
}
